package br.com.werp.regras.almoxarifado.integracao;

import br.com.werp.regras.geral.integracao.MasterDAO;
import br.com.werp.regras.geral.util.BeanUtil;
import br.com.werp.regras.geral.util.Constantes;
import br.com.werp.regras.geral.util.Util;
import br.com.werp.regras.geral.vos.almoxarifado.ProdutoVO;
import br.com.werp.regras.geral.vos.tabelas.Produto;
import br.com.werp.regras.geral.vos.tabelas.Produto_empresa;

import java.sql.Connection;

import java.util.List;
import java.util.ResourceBundle;


/**
 * @author Sobreira
 * Criado em 18/10/2005
 */
public class ProdutoDAO extends MasterDAO {
    private static ProdutoDAO produtoDAO;

    private ProdutoDAO(String banco) throws Exception {
        super(banco);
    }

    public static ProdutoDAO getProdutoDAO() throws Exception {
        if (produtoDAO == null) {
            ResourceBundle bundle = ResourceBundle.getBundle(Constantes.CONFIG);
            produtoDAO = new ProdutoDAO(bundle.getString(Constantes.BANCO));
        }

        return produtoDAO;
    }

    public void inserirProduto(Object key, Produto produto)
        throws Exception {
        Connection connection = validarTransacao(key);
        inserirVO(connection, produto, new String[] { "prod_id" });
    }

    public void inserirProduto_empresa(Object key,
        Produto_empresa produto_empresa) throws Exception {
        Connection connection = validarTransacao(key);
        inserirVO(connection, produto_empresa, new String[] { "prem_id" });
    }

    public Produto_empresa pesquisarProdutoEmpresa(Object key,
        Produto_empresa produto_empresa) throws Exception {
        Connection connection = validarTransacao(key);
        List list = pesquisarVO(connection, produto_empresa);

        return (Produto_empresa) Util.get0(list);
    }

    public void atualizarProdutoProdutoEmpresa(Object key,
        Produto_empresa produto_empr) throws Exception {
        Connection conn = validarTransacao(key);
        atualizarVO(conn, produto_empr, new String[] { "prem_id" });
    }

    public List obterProduto(ProdutoVO produtoVO) throws Exception {
        Connection connection = getConexao();

        try {
            String tabelas = " produto,produto_empresa ";
            String where = " and prem_produto = prod_id ";

            /*if (produtoVO.getPrem_id() != 0) {
                where += (" and prem_id =  " + produtoVO.getPrem_id());
            }*/

            if (!Util.isNullOrEmpty(produtoVO.getProd_descricao())) {
                where += (" and prod_descricao like " +
                aspasLike(produtoVO.getProd_descricao()));
                produtoVO.setProd_descricao(null);
            }

            where += (" order by prod_descricao ");

            return pesquisarVO(connection, produtoVO, where, tabelas);
        } finally {
            liberaConeccao(connection);
        }
    }

    public List obterProdutoGrupo(int grpoId) throws Exception {
        Connection connection = getConexao();

        try {
            String tabelas = " grupo, mercadoria_empresa, produto_mercadoria, " +
                "produto_empresa, produto ";
            String where = "mcem_grupo = grpo_id and pdmc_mercadoria = mcem_id " +
                "and pdmc_produto = prem_id and prem_produto = prod_id ";

            if (grpoId != 0) {
                where += (" and grpo_id =  " + grpoId);
            }

            ProdutoVO produtoVO = new ProdutoVO();

            return preencheVO(connection, produtoVO, tabelas, where,
                BeanUtil.listarPropriedades(produtoVO));
        } finally {
            liberaConeccao(connection);
        }
    }

    public List obterProduto(Produto produto) throws Exception {
        Connection conn = getConexao();

        try {
            return pesquisarVO(conn, produto);
        } finally {
            liberaConeccao(conn);
        }
    }

    public static void main(String[] args) throws Exception {
        System.out.println(new ProdutoDAO("").obterProdutoGrupo(1));
    }

    public void salvarProduto(Produto produto, Object key)
        throws Exception {
        Connection connection = validarTransacao(key);
        inserirVO(connection, produto, new String[] { "prod_id" });
    }

    public void atualizarProduto(Produto produto, Object key)
        throws Exception {
        Connection connection = validarTransacao(key);
        atualizarVO(connection, produto, new String[] { "prod_id" });
    }

    public List pesquisarProduto(Produto produto, Object key)
        throws Exception {
        Connection connection = null;

        try {
            if (key == null) {
                connection = getConexao();
            } else {
                connection = validarTransacao(key);
            }

            String where = "";

            if (!Util.isNullOrEmpty(produto.getProd_descricao())) {
                where += (" and prod_descricao like " +
                aspasLike(produto.getProd_descricao()));
                produto.setProd_descricao(null);
            }

            return pesquisarVO(connection, produto, where);
        } finally {
            liberaConeccao(connection);
        }
    }

    public List pesquisarProdutos(Produto produto) throws Exception {
        return pesquisarProduto(produto, null);
    }
}
